package ar.uba.fi.cimII7566.cuat201102.automatizacionNegroHumo.modelo;

import java.awt.Color;
import java.util.ArrayList;
import java.util.List;

public class Sensor {

	private Color color = null;
	private Posicion posicion = null;
	private Long id;
	private List<EnumEvento> tipo = null;
	private List<Evento> listEvento = null;
	private Entidad propietario;

	private static Long idFactory = null;

	public Sensor(Entidad propietario) {
		if (Sensor.idFactory == null) {
			Sensor.idFactory = new Long(0);
		}
		Sensor.idFactory = new Long(Sensor.idFactory.longValue() + 1);
		this.id = Sensor.idFactory;
		tipo = new ArrayList<EnumEvento>();
		listEvento = new ArrayList<Evento>();
		this.setColor(new Color(0.0f, 0.0f, 0.0f, 1f));
		this.setPosicion(Posicion.factory());
		this.setPropietario(propietario);
	}

	/**
	 * @return the id
	 */
	public Long getId() {
		return id;
	}

	/**
	 * @param id
	 *            the id to set
	 */
	public void setId(Long id) {
		this.id = id;
	}

	private double velocidadViento;

	public void setVelocidadViento(double velocidadViento) {
		this.velocidadViento = velocidadViento;
	}

	public double getVelocidadViento() {
		return velocidadViento;
	}

	/**
	 * @return the tipo
	 */
	public List<EnumEvento> getTipo() {
		return tipo;
	}

	/**
	 * @param tipo
	 *            the tipo to set
	 */
	public void setTipo(List<EnumEvento> tipo) {
		this.tipo = tipo;
	}

	/**
	 * @return the listEvento
	 */
	public List<Evento> getListEvento() {
		return listEvento;
	}

	/**
	 * @param listEvento
	 *            the listEvento to set
	 */
	public void setListEvento(List<Evento> listEvento) {
		this.listEvento = listEvento;
	}

	@Override
	public String toString() {
		return "Sensor [id = " + id.toString() + "]";
	}

	public void setColor(Color color) {
		this.color = color;
	}

	public Color getColor() {
		return color;
	}

	public void setPosicion(Posicion posicion) {
		this.posicion = posicion;
	}

	public Posicion getPosicion() {
		return posicion;
	}

	/**
	 * @return the propietario
	 */
	public Entidad getPropietario() {
		return propietario;
	}

	/**
	 * @param propietario
	 *            the propietario to set
	 */
	public void setPropietario(Entidad propietario) {
		this.propietario = propietario;
	}

	public void recibirEvento(Evento evento) {
		Evento encontrado = null;
		for (EnumEvento enumEvento : tipo) {
			if (enumEvento.getValor().equals(evento.getTipoEvento().getValor())) {
				for (Evento e : listEvento) {
					if (e.getTipoEvento().getValor().equals(evento.getTipoEvento().getValor())) {
						if ((e.getEmisor() == null && evento.getEmisor() == null) || (e.getEmisor().toString().equals(evento.getEmisor().toString()))) {
							encontrado = e;
						}
					}
				}
				if (encontrado != null) {
					encontrado.setDescripcion(evento.getDescripcion());
					encontrado.setEmisor(evento.getEmisor());
					encontrado.setInstante(evento.getInstante());
					encontrado.setTipoEvento(evento.getTipoEvento());
					encontrado.setValor(evento.getValor());
				} else {
					listEvento.add(evento);
				}
			}
		}
	}

	public void eliminarEvento(Entidad emisor) {
		List<Evento> listRemover = new ArrayList<Evento>();
		if (!listEvento.isEmpty()) {
			for (Evento evento : listEvento) {
				if ((evento.getEmisor() != null)
						&& (emisor != null)
						&& (evento.getEmisor().toString().equals(emisor.toString()))) {
					listRemover.add(evento);
				}
			}
		}
		if (!listRemover.isEmpty()) {
			for (Evento evento : listRemover) {
				listEvento.remove(evento);
			}
		}
		listRemover.clear();
	}
}